// 类型别名 关键字 type : 作用就是给一个类型起别名

// | : 或  & : 与
// | : 联合类型 可以将很类型联合起来 
type Man = number | string // | Person3
// 交叉类型 如果没有交叉点 就变成了 never
type Mans = number & boolean

interface Person3 {
  username:string;
  password:string;
  sex:number
}


interface Person4 {
  username:string;
  nickName:string;
}

// 
type Person34 = Person3 | Person4;

// let str : Mans = 10

let person :Person34 = {
  username:'123',
  password:'123',
  sex:12,
  nickName:'123'
}

function getPerson(params:Person34){
  // 联合类型 : 保证程序不会报错 
  params.username
  // params.password
  // params.sex
  // params.nickName
}

getPerson(person)


// type : 声明一个类型 可以是单独的类型 也可以是 联合类型 交叉类型
// 方法 : 当做一个类型

// 需要声明一个方法 参数是一个方法 参数 有2个 number  string 
// 返回值是number或者string

// Fn 是一个函数 返回值是 number或者string
type Fn = (params1:number, params:string)=>number | string

function callback(fn:Fn){

}

callback((params1:number,params2:string)=>{
  return '10'
})


function returnPromsie():Promise<number>{
  return new Promise(resolve=>{
    resolve(10)
  })
}

// Person1: username  password
// 通过一个方法 getPromise 返回值是Promise<Person1>  
// 参数1: 回调 有一个参数是string
// 参数2: 是Promise 类型是接口 {username:string} 


type ButtonKey1 = {
  username:string;
  password:string;
  sex?:string
}
type Fn1 = (params:string)=>void
interface Keys {
  key1?:number;
  key2?:number;
  username:string
}
const getPromise=(params1:Fn1,params2:Promise<Keys>):Promise<ButtonKey1>=>{
  // Promise<约束的是resolve(里面的东西)>
  return Promise.resolve({
    username:'张三',
    password:'123'
  })
}

getPromise((str:string)=>{},Promise.resolve({username:'133'})).then(res=>{})